# -*- encoding : utf-8 -*-
# @Time : 2022/12/9 20:30
# @Author : Future
# @Email : ccsmlg@vip.qq.com
# @File : serializers.py
# @Software : PyCharm

from rest_framework import serializers
from drf_study.models import Student, Classes


# 写模型类
class StudentSerializer(serializers.ModelSerializer):
    # 重写  默认展示classes=class.id  改动结果为模型类展示内容classes=classes.__str__(self)但会导致新建不能选择班级
    # classes = serializers.StringRelatedField(label='班级')
    # 正常做法，新增一个字段显示,这样班级序号还在，新增了一个班级名称显示
    class_name = serializers.CharField(source='classes.name', read_only=True)

    class Meta:
        model = Student  # 直接将序列化器等于你要展示的模型类，它会自动帮你全部做好
        # fields = '__all__'  # 指定映射的字段  __all__所有的字段
        exclude = ['is_delete']  # 不映射的字段，隐藏当前你不想展示的字段，注意：需要注释展示全部字段
        extra_kwargs = {
            'age': {'min_value': 0, 'max_value': 200}  # 确保输入的值在0-200之间
        }

    # 追加额外的校验逻辑,属性级别的，对单个字段进行校验，这样前端发送过来的数据会先通过数据校验，通过才会创建
    # def validate_name(self, value):
    #     if 'mq' not in value.lower():
    #         raise serializers.ValidationError('用户名需要包含mq')
    #     return value

    # def validate(self, data):
    #     # 追加额外的逻辑校验-对象级别的，会把传入的所有数据都传入date  date={'name':'moran','age':18}
    #     if 'mq' not in data['name'].lower():
    #         raise serializers.ValidationError('用户名需要包含mq')
    #     elif data['age'] < 18:
    #         raise serializers.ValidationError('未成年禁止访问！')
    #     return data


class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex']


class ClassesSerializer(serializers.ModelSerializer):
    # 直接把学生的序列化器放到班级里面  read_only=True不允许修改
    student_set = StudentSerializerSimple(many=True, read_only=True)  # 嵌套序列化  对管理器进行处理

    class Meta:
        # 导入模型类
        model = Classes
        # 展示字段  因为有逻辑删除字段，所以不展示全部字段
        # fields = '__all__'
        # 展示除逻辑删除以外的全部字段
        exclude = ['is_delete']
